home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / quicspool / libqmsquery / qmsmap.y < prev    next >
Text File  |  1990-10-01  |  2KB  |  109 lines

  1. %{
  2. #ifndef lint
  3. static char *rcs = "$Header: qmsmap.y,v 1.1 88/01/15 12:19:03 simpson Rel $";
  4. #endif
  5. /*
  6. $Log:    qmsmap.y,v $
  7.  * Revision 1.1  88/01/15  12:19:03  simpson
  8.  * initial release
  9.  * 
  10.  * Revision 0.1  87/12/11  17:12:01  simpson
  11.  * beta test
  12.  * 
  13. */
  14. #include <stdio.h>
  15. #include <setjmp.h>
  16. #include <local/standard.h>
  17. #include "qms.h"
  18.  
  19. extern FILE    *_Ifp, *_Ofp;
  20. extern Boolean    _FirstChar;
  21. static jmp_buf    Env;
  22. char        *malloc();
  23. static struct qmsmap    *MapList, *P;
  24. static int    ByteCount, CheckSum;
  25. char        S[77];
  26. %}
  27. %union {
  28.     char    s[77];
  29. }
  30. %token <s> MAP MAPEND BYTECOUNT DATA ENDLINE
  31. %%
  32. mapdata : 
  33.     MAP ENDLINE
  34.     datalines
  35.     MAPEND ENDLINE 
  36.     ;
  37.  
  38. datalines : 
  39.     datalines 
  40.     dataline
  41.     {
  42.         if (MapList == NULL) {
  43.         MapList = (struct qmsmap *)malloc((unsigned)
  44.         sizeof(struct qmsmap));
  45.         MapList->count = ByteCount;
  46.         MapList->checksum = CheckSum;
  47.         (void)strcpy(MapList->data = malloc((unsigned)(strlen(S) 
  48.         + 1)), S);
  49.         MapList->next = NULL;
  50.         } else {
  51.         for (P = MapList; P->next; P = P->next)
  52.             ;
  53.         P->next = (struct qmsmap *)malloc((unsigned)
  54.         sizeof(struct qmsmap));
  55.         P = P->next;
  56.         P->count = ByteCount;
  57.         P->checksum = CheckSum;
  58.         (void)strcpy(P->data = malloc((unsigned)(strlen(S) + 1)), S);
  59.         P->next = NULL;
  60.         }
  61.     }
  62.     |
  63.     /* epsilon */
  64.     ;
  65.         
  66. dataline :
  67.     BYTECOUNT 
  68.     {
  69.         (void)sscanf(&$1[1], "%X", &ByteCount);
  70.     }
  71.     DATA
  72.     {
  73.         (void)sscanf(&$3[strlen($3) - 4], "%X", &CheckSum);
  74.         $3[strlen($3) - 4] = '\0';
  75.         (void)strcpy(S, $3);
  76.     }
  77.     ENDLINE
  78.     ;
  79. %%
  80. #include "qmsmaplex.c"
  81.  
  82. struct qmsmap *qmsmap(north, south, west, east)
  83. double north, south, west, east;
  84. {
  85.     _FirstChar = TRUE;
  86.     MapList = NULL;
  87.     fputs(QUICON, _Ofp);
  88.     fprintf(_Ofp, "%s00000", SYNTAX);
  89.     fprintf(_Ofp, "%sMAP%05d%05d%05d%05d%s", INFO, (int)(north * 1000), 
  90.     (int)(south * 1000), (int)(west * 1000), (int)(east * 1000), ENDCMD);
  91.     fputs(QUICOFF, _Ofp);
  92.     (void)fflush(_Ofp);
  93.     if (setjmp(Env)) {
  94.     while (timedgetc(_Ifp) != EOF)    /* Discard remaining input */
  95.         ;
  96.     return NULL;
  97.     }
  98.     if (yyparse() != 0)
  99.     return NULL;
  100.     yysptr = yysbuf;        /* Resets lex lookahead buffer */
  101.     return MapList;
  102. }
  103.  
  104. static yyerror(s)
  105. char    *s;
  106. {
  107.     longjmp(Env, TRUE);
  108. }
  109.